package A_java语言的新特性.d.重复注解;

import java.lang.annotation.*;

/**
 * Created by zc on 2017/3/10.
 * 自从Java 5引入了注解机制，这一特性就变得非常流行并且广为使用。
 * 然而，使用注解的一个限制是相同的注解在同一位置只能声明一次，不能声明多次。
 * Java 8打破了这条规则，引入了重复注解机制，这样相同的注解可以在同一地方声明多次。
 * <p>
 * 重复注解机制本身必须用@Repeatable注解。
 * 事实上，这并不是语言层面上的改变，更多的是编译器的技巧，底层的原理保持不变。
 */
public class RepeatingAnnotations {
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Filters {
        Filter[] value();
    }

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Repeatable(Filters.class)
    public @interface Filter {
        String value() default "nothing";
    }

    @Filter(value = "filter1")
    @Filter(value = "filter2")
    public interface Filterable {
    }

    public static void main(String[] args) {
        for (Filter filter : Filterable.class.getAnnotationsByType(Filter.class)) {
            System.out.println(filter.value());
        }
    }

}
